package persistencia.dao;

import java.util.List;


import org.hibernate.HibernateException;
import org.hibernate.Session;

import persistencia.hbt.HibernateUtil;

import bean.EntidadPersistente;

@SuppressWarnings({ "rawtypes"  })
public class EntidadPersistenteDAO {
	protected static Session session = null;
	private static EntidadPersistenteDAO instancia = null;
	
	public static EntidadPersistenteDAO getInstancia(){
		if(instancia == null)
			instancia = new EntidadPersistenteDAO();
		
		if (session == null)
			session = HibernateUtil.getSession();
		
		return (EntidadPersistenteDAO) instancia;
	}
	
	public void persistir(EntidadPersistente ent){
		session.beginTransaction();
		if (ent.getId() == null)
			session.save(ent);
		else
			session.update(ent);
		session.getTransaction().commit();
	}
	
	public EntidadPersistente buscar(EntidadPersistente ent) {
		if (ent.getId() == null)
			return null;
		
		EntidadPersistente entidad = (EntidadPersistente) session.get(ent.getClass(), ent.getId());
		return entidad;
	}
	
	public List buscarTodos(String className) throws Exception {
		List lst = null;
		try{
			String fromQuery = "from " + className.toString();
			lst = session.createQuery(fromQuery).list();
		} catch (Exception ex){ 
			throw new Exception("Se ha producido un error en la busqueda");
		}
		
		return lst;	
	}
	
	public void eliminar(EntidadPersistente ent) throws Exception {
		if (ent.getId() == null)
			return;
		
		try{
			session.beginTransaction();
			session.delete(ent);
			session.getTransaction().commit();
		}catch (HibernateException e) {
			session.getTransaction().rollback();
			throw new Exception("La entidad se encuentra en uso.");
		}
	}
}
